package model

import (
	"errors"

	"gorm.io/gorm"
)

// defaultUserModel 实现 UserModel 接口
type defaultUserModel struct {
	db *gorm.DB
}

func NewUserModel(db *gorm.DB) UserModel {
	return &defaultUserModel{
		db: db,
	}
}

func (m *defaultUserModel) Create(user *User) error {
	return m.db.Create(user).Error
}

func (m *defaultUserModel) FindByEmail(email string) (*User, error) {
	var user User
	err := m.db.Where("email = ?", email).First(&user).Error

	// 明确区分"记录不存在"和"真实错误"
	if errors.Is(err, gorm.ErrRecordNotFound) {
		return nil, nil // 明确返回nil表示不存在
	}
	if err != nil {
		return nil, err // 其他数据库错误
	}
	return &user, nil
}

func (m *defaultUserModel) FindByPhone(phone string) (*User, error) {
	var user User
	err := m.db.Where("phone = ?", phone).First(&user).Error
	if err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			return nil, errors.New("用户不存在")
		}
		return nil, errors.New("查询用户失败")
	}
	return &user, nil
}

func (m *defaultUserModel) FindById(id int) (*User, error) {
	var user User
	err := m.db.Where("id = ?", id).First(&user).Error
	if err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			return nil, errors.New("用户不存在")
		}
		return nil, errors.New("查询用户失败")
	}
	return &user, nil
}

func (m *defaultUserModel) Update(id int, data map[string]interface{}) error {
	return m.db.Model(&User{}).Where("id = ?", id).Updates(data).Error
}

// 实现头像更新方法
func (m *defaultUserModel) UpdateAvatar(id int, avatarURL string) error {
	return m.db.Model(&User{}).
		Where("id = ?", id).
		Update("avatar", avatarURL).
		Error
}
